//
//  RAC_Define_Hong.m
//  ReactiveCocoa
//
//  Created by apple on 2017/9/9.
//  Copyright © 2017年 apple. All rights reserved.
//

#import "RAC_Define_Hong.h"
#import <ReactiveObjC/ReactiveObjC.h>
@interface RAC_Define_Hong ()

@property (nonatomic, strong) RACSignal *signal;

@end

@implementation RAC_Define_Hong

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    self.view.backgroundColor = [UIColor whiteColor];
    
    
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, 200, 100, 40)];
    
//    label.text = @"我";
    
    label.textColor = [UIColor redColor];
    
    label.backgroundColor = [UIColor greenColor];
    
    [self.view addSubview:label];

    
    
    UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(150, 300 , 100, 50)];
    

    textField.layer.borderWidth = 1;
    textField.layer.borderColor = [UIColor blueColor].CGColor;
    
    [self.view addSubview:textField];
    
    
#pragma RAC 中 常用的宏
    
    
#pragma 第一个常用宏 - 用来给某个对象的某个属性绑定一个信号 - 只要信号产生内容，就把内容赋值给对象的属性
      //和下面的宏方法进行对比
//    //这个相当于给textField addtarget action  - 监听输入数值的改变
//    [textField.rac_textSignal subscribeNext:^(NSString * _Nullable x) {
//        
//        //输入一个数，便打印出来
//        NSLog(@"textField - x = %@",x);
//        
//        label.text = x;
//        
//    }];
    
    //此宏 和上面的方法达成一样的目的
    //第一个常用宏 - 用来给某个对象的某个属性绑定一个信号 - 只要信号产生内容，就把内容赋值给对象的属性
    RAC(label, text) = textField.rac_textSignal;

    
#pragma 第二个常用宏 - 用来监听某个对象属性的改变 - KVO的更简写
    
    //和下面的方法一样的效果
//    [[self.view rac_valuesAndChangesForKeyPath:@"frame" options:NSKeyValueObservingOptionNew observer:self] subscribeNext:^(RACTwoTuple<id,NSDictionary *> * _Nullable x) {
//       
//        
//    }];
    
    
    [RACObserve(self.view, frame) subscribeNext:^(id  _Nullable x) {
        
    }];
    
    
#pragma 第三个常用宏 - 配套使用 @weakify(self)  @strongify(self) - 防止强引用
    
    @weakify(self);
    
    RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
       
        @strongify(self)
        
        NSLog(@"self = %@",self);
        
        return nil;
    }];
    

    _signal = signal;

    
    
#pragma 第四个常用宏 - 包装成元组 - 方法和nsarray 一样
    
    RACTuple *tuple = RACTuplePack(@1, @"2", @3, @4);
    
    NSLog(@"tuple = %@",tuple[2]);
    
    NSString *i = tuple[1];
    
    NSLog(@"i = %@",i);
}



@end
